package com.dzx.currentency.publish;

/**
 * @author DuanZhaoXu
 * @ClassName:
 * @Description:
 * @date 2018年11月19日 14:06:01
 */

import com.dzx.currentency.annoations.Recommend;
import com.dzx.currentency.annoations.ThreadSafe;

/**
 * 枚举模式，最安全
 * 利用枚举的特性，一个枚举的构造方法只会被调用一次实现单例模式，推荐使用这种方式
 * <p>
 * 优点：1、相比懒汉模式，更能保证线程安全性
 * 2、相比饿汉模式，也只会在第一次使用的时候进行创建实例，不会造成资源浪费
 */
@ThreadSafe
@Recommend
public class SingletonExample7 {


    private SingletonExample7() {
    }

    public static SingletonExample7 getInstance() {
        return Singleton.INSTANCE.getInstance();
    }

    private enum Singleton {
        INSTANCE; //只有一个枚举变量，保证构造方法只调用一次


        private SingletonExample7 singletonExample7;

        //jvm保证这个方法绝对只调用一次
        Singleton() {
            System.out.println("我只会被调用一次");
            singletonExample7 = new SingletonExample7();
        }

        public SingletonExample7 getInstance() {
            return singletonExample7;
        }
    }

    public static void main(String[] args) {
        System.out.println(SingletonExample7.getInstance());
        System.out.println(SingletonExample7.getInstance());
        System.out.println(SingletonExample7.getInstance());
    }
}
